Решение нелинейных уравнений
Решение систем нелинейных уравнений
Основные определения
Многие практические задачи сводятся к решению систем нелинейных уравнений. Пусть для вычисления неизвестных требуется решить систему нелинейных уравнений
В отличие от систем линейных уравнений, не существует прямых методов решения нелинейных систем общего вида. В таких случаях обычно используются итерационные методы.
Метод простых итераций
В методе простых итераций сначала необходимо представить систему в виде
Для этого достаточно, например, к левой и правой частям -го уравнения системы прибавить .
Пусть нам известно начальное приближение . Подставляя его в правую часть преобразованной системы, получим первое приближение . Подставив первое приближение в правую часть преобразованной системы, получим второе приближение и т.д.
Таким образом, очередное прибижение вычисляется через предыдущее по формулам
где .
Условием окончания итерационного процесса является малость изменения неизвестных в двух последовательных приближениях, т.е.
Достаточное условие сходимости метода простых итераций имеет вид:
Начальные приближения должны быть достаточно близкими к истинному решению. В противном случае итерационный процесс может не сойтись.
Пример. Решим в Engee систему нелинейных уравнений
с точностью .
Перепишем систему уравнений в виде
Для этого выразим из первого уравнения, а – из второго и поменяем уравнения местами. Получим:
Найдем начальное приближение графически. Для этого построим графики функций и и приближенно оценим координаты точки их пересечения.
using Plots;
Func1(x) = 1.5 - cos(x)
Func2(x) = 0.5 + asin(2*x - 1);
x = collect(0:0.05:1);
plot(x, Func1)
plot!(x, Func2)
Зададим функции , и точность . Из графика видно, что в качестве начальных приближений можно взять , .
Fun1 = (x, y) -> 0.5*(1 + sin(y - 0.5));
Fun2 = (x, y) -> 1.5 - cos(x);
eps = 10^(-4);
x = 0.6;
x1 = x + 2*eps;
y = 0.5;
y1 = y + 2*eps;
Реализуем алгоритм метода простых итераций.
while (abs(x1-x) > eps) && (abs(y1-y) > eps)
x = x1;
y = y1;
x1 = Fun1(x, y);
y1 = Fun2(x, y);
end
println("x = ", x1);
println("y = ", y1);
✏️Задание 1
Решите в Engee систему нелинейных уравнений
с точностью .
Подсказка
Сначала нужно переписать систему уравнений в виде
Для этого выразите из первого уравнения, а – из второго уравнения и поменяйте уравнения местами. Получится система
Решение
Построим графики функций и .
using Plots;
Func1(x) = 0.5 - cos(x - 1);
Func2(x) = acos(x - 3);
x = collect(3:0.05:4);
plot(x, Func1)
plot!(x, Func2)
Из графика видно, что в качестве начального приближения можно взять , .
Fun1 = (x, y) -> cos(y) + 3;
Fun2 = (x, y) -> 0.5 - cos.(x - 1);
eps = 10^(-4);
x = 3.3;
x1 = x + 2*eps;
y = 1.2;
y1 = y + 2*eps;
while (abs(x1-x) > eps) && (abs(y1-y) > eps)
x = x1;
y = y1;
x1 = Fun1(x, y);
y1 = Fun2(x, y);
end
println("x = ", x1);
println("y = ", y1);
Использование встроенных функций Engee
В библиотеке NLsolve содержится функция nlsolve, которая численно решает системы нелинейных уравнений вида
Пример. Решим в Engee систему нелинейных уравнений
с помощью функции nlsolve.
Сначала создадим вектор-функцию , содержащую левые части уравнений системы. Неизвестные и обозначим как элементы вектора x: x[1] и x[2].
using NLsolve;
function f(x)
[(x[1]+3)*(x[2]^3-7)+18, sin(x[2]*exp(x[1])-1)];
end
Затем решим систему с помощью функции nlsolve, аргументами которой являются функция и вектор начальных приближений неизвестных. Примем в качестве начальных приближений , . Сохраним решение в объекте sol. Объект sol имеет несколько полей, содержащих информацию об алгоритме решения, начальном приближении, числе итераций, величине достигнутой погрешности, числе вызовов функции и ее производной и т.д.
sol = nlsolve(f, [0.1, 1.2])
Решение системы содержится в поле sol.zero:
sol.zero
✏️Задание 2
Решите в Engee систему нелинейных уравнений из Задания 1:
с помощью функции nlsolve.
Решение
Сначала преобразуем систему к виду
Получим:
В качестве начальных приближений возьмем те же значения, что и в Задании 1: , .
using NLsolve;
function f(x)
[cos(x[1]-1)+x[2]-0.5, x[1]-cos(x[2])-3];
end
sol = nlsolve(f, [3.3, 1.2]);
sol.zero